package com.runjian.rundo.iot.agent.iec104.parser.frame.control.process;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.runjian.rundo.iot.agent.iec104.consts.Ti;
import com.runjian.rundo.iot.agent.iec104.parser.frame.ASDUFrame;
import com.runjian.rundo.iot.agent.iec104.parser.frame.InfoElement;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ByteUtil;
import com.runjian.rundo.iot.agent.iec104.parser.frame.SinglePointRemoteControl;
import com.runjian.rundo.iot.agent.iec104.parser.frame.control.base.TaControl;
import io.netty.buffer.ByteBuf;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

/**
 * C_SE_NC_1(50, "遥调设点,短浮点数(参数设置)"),
 *
 * 在代码中，组成如下：
 * 1字节 协议头
 * 1字节 报文长度
 * 2字节 发送序列号
 * 2字节 接收序列号
 * 2字节 类型标识符
 * 1字节 sq(第一位)和元素数量（后七位）
 * 1字节 T（第一位）、PN（第二位）、COT（后六位）
 * 1字节 写死0
 * 2字节 公共地址
 * 3字节 信息体地址
 * 4字节 设定值
 * 1字节 限定词
 * 7字节 时标
 * 1字节 限定词
 * @author CaoQingHua
 */
@Getter
@Setter
public class C_SE_NC_1 extends TaControl {


    private static final Logger log = LoggerFactory.getLogger(C_SE_NC_1.class);

    @Override
    public void init() {
        super.init();
        // 类型
        this.setTi(Ti.C_SE_NC_1);

    }

    @Override
    public void analysisInfo(byte[] msg) {
        // 预置/激活单个参数命令(参数设置)
        this.addInfoElement(InfoElement.<Float>builder().address(ByteUtil.bytesToInt(new byte[] {msg[12], msg[13], msg[14],0x00}))
            .value(ByteUtil.bytesToFloat(ArrayUtil.sub(msg, 15, 19))).build());
        this.setQos((short)(msg[19] & 0xff));
    }

    @Override
    public void addControlInfoElement(int address, Object value) {
        if (!StrUtil.isNumeric(value.toString())) {
            Assert.isTrue(Boolean.FALSE, "值必须是浮点型数字");
        }
        super.addControlInfoElement(address,value);
    }

    /**
     * 写入byteBuf
     * @param assembleByteBuf 字对缓存对象
     * @param infoElement 信息对象
     */
    public void writeInfoContent(ByteBuf assembleByteBuf,InfoElement<Object> infoElement) {
        if (infoElement.getValue() == null) {
            float value = 0;
            assembleByteBuf.writeBytes(ByteUtil.floatToBytes((value)));
        }
        if (infoElement.getValue() instanceof String) {
            float value = Float.parseFloat(infoElement.getValue().toString());
            assembleByteBuf.writeBytes(ByteUtil.floatToBytes((value)));
        }
        if (infoElement.getValue() instanceof Number) {
            Number number = (Number) infoElement.getValue();
            float value = number.floatValue();
            assembleByteBuf.writeBytes(ByteUtil.floatToBytes((value)));
        }
    }



}
